﻿using System;
using TheOutLetLibrary.Dominio;
using System.Data.OleDb;
using System.Globalization;
using System.Threading;

namespace TheOutLetLibrary.Infraestrutura {

    public class AccessNotaFiscalDAO: INotaFiscalDAO {

        private OleDbTransaction transacao;
        public OleDbTransaction Transacao {
            set { transacao = value; }
        }
        
        public void IncluiNotaFiscal(NotaFiscal nf) {

            NotaFiscal nfProcurada = AcheNotaFiscal("substituir este argumento pelo cgc do emitente da nf", nf.NR_NF);

            if(nfProcurada == null) {

                OleDbCommand comando = new OleDbCommand();
                comando.Transaction = transacao;
                comando.Connection = transacao.Connection;
           
                comando.CommandText =
                    "INSERT INTO tb_nota_fiscal (NR_NF, DT_EMISSAO_NF, XID_REMESSA, XID_EMPRESA, NR_TOTAL_DE_PECAS_INFORMADAS) " +
                    " VALUES (@NR_NF, @DT_EMISSAO_NF, @XID_REMESSA, @XID_EMPRESA, @NR_TOTAL_DE_PECAS_INFORMADAS)";
                comando.Parameters.Add("@NR_NF", OleDbType.VarChar).Value = nf.NR_NF;
                comando.Parameters.Add("@DT_EMISSAO_NF", OleDbType.DBDate).Value = nf.DT_EMISSAO_NF;
                comando.Parameters.Add("@XID_REMESSA", OleDbType.Integer).Value = nf.XID_REMESSA;
                comando.Parameters.Add("@XID_EMPRESA", OleDbType.Integer).Value = nf.XID_EMPRESA;
                comando.Parameters.Add("@NR_TOTAL_DE_PECAS_INFORMADAS", OleDbType.Integer).Value = nf.NR_TOTAL_DE_PECAS_INFORMADAS;

                comando.ExecuteNonQuery();

                comando.CommandText = "SELECT @@IDENTITY";
                nf.XID_NOTA_FISCAL = Convert.ToInt32(comando.ExecuteScalar());

            } else {
                throw new Exception("NF já foi importada");
            }
        }

        public NotaFiscal AcheNotaFiscal(string cgc, string numeroNF) {

            OleDbCommand comando = new OleDbCommand();
            // Estudar a possibilidade de armazenar o CGC do emitente da NF
            // e utilizá-lo no critério de busca. 
            comando.CommandText =
                "SELECT * FROM tb_nota_fiscal " +
                "WHERE NR_NF = @numeroNF";
            comando.Parameters.Add("@numeroNF", OleDbType.VarChar).Value = numeroNF;
            comando.Transaction = transacao;
            comando.Connection = transacao.Connection;
            OleDbDataReader reader = comando.ExecuteReader();
            if(reader.HasRows) {
                reader.Read();
                return new NotaFiscal {
                    NR_NF = reader.GetString(reader.GetOrdinal("NR_NF")),
                    DT_EMISSAO_NF = reader.GetDateTime(reader.GetOrdinal("DT_EMISSAO_NF"))
                };
            } else {
                return null;
            }

        }
        
        public void ExcluiNotaFiscal(NotaFiscal nf) {
            Console.WriteLine("Vou excluir Nota Fiscal {0}", nf.NR_NF);
            Console.ReadLine();           
        }

    }

}
